package kkb.IOTest;

import org.junit.Test;

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;

public class IO {

//    public static void main(String[] args) throws IOException {
//
//
//        //创建file对象   一参构造方法
//        File file = new File("D://lixiaoyuIO.txt");
//
//        // 判断D://lixiaoyuIO.txt 是否存在 不存在 -- 创建 返回true
//        //                               存在 -- 返回 false
//        // 还有情况会返回false：
//        //              会因为操作系统然后出现异常。解决方法：1、编译器使用管理员身份运行。2、换文件所在的盘。
//        //我们是属于后端开发工程师，代码是发布在服务器的所以不需要考虑这些问题。
//        boolean newFile = file.createNewFile();
//        System.out.println(newFile?"文件创建成功":"文件已经存在");
//
//
//        File dir = new File("D://io");
//        //创建文件夹
//        dir.mkdir();
//        //创建file 对象   两参构造 （文件夹，文件名）
//        //在D盘 io文件夹下 创建 lixiaoyuIO2.txt文件
//        File file1 = new File("D://io","lixiaoyuIO2.txt");
//        boolean newFile1 = file1.createNewFile();
//        System.out.println(newFile1?"文件创建成功":"文件已经存在");
//
//        //创建file 对象   两参构造 （file对象，文件名）
//        //在D盘 io文件夹下 创建 lixiaoyuIO3.txt文件
//        File file2 = new File(dir,"lixiaoyuIO3.txt");
//        boolean newFile2 = file2.createNewFile();
//        System.out.println(newFile2?"文件创建成功":"文件已经存在");
//
//        //删除文件
//        file1.delete();
//        file2.delete();
//
//
//
//        //        路劲分隔符;
//        System.out.println("路劲分隔符"+File.pathSeparator);
//        //        名称分隔符\
//        System.out.println("名称分隔符"+File.separator);
//
//
//        //获取文件 绝对路径
//        File file3 = new File("io");
//        String absolutePath = file3.getAbsolutePath();
//        System.out.println("文件的路劲是I=="+absolutePath);
//        //文件的路劲是I==D:\MyGitNote\java\kkbkuaidi\io
//
//
//        String name = file3.getName();
//        System.out.println("文件名称是---->"+name);
//        //文件名称是---->io
//
//
//        File file4 = new File("D:\\MyGitNote\\java\\JAVA");
//        String parent = file4.getParent();
//        File parentFile = file4.getParentFile();
//        System.out.println("JAVA文件夹的上级包名是---->"+parent);
//        System.out.println("JAVA文件夹的上级包名是====>"+parentFile.toString());
//        //JAVA文件夹的上级包名是---->D:\MyGitNote\java
//        //JAVA文件夹的上级包名是====>D:\MyGitNote\java
//
//
//        //length 文件的长度（文件的大小 是按照字节算。）
//        //1024 字节 = 1 KB
//        // 1024 KB = 1 MB
//        // 1024 MB = 1 G
//        File file5 = new File("D:\\MyGitNote\\java\\kkbkuaidi\\out\\production\\homeWorkTest\\homework\\Student.class");
//        long length = file5.length();
//        System.out.println("JAVA文件的大小是====>"+length);
//
//
//        //listFiles()  获取文件夹里的所有的文件对象
//        //list();       获取到文件夹里所有文件 字符串
//        File file6 = new File("D:\\MyGitNote");
//        File[] files = file6.listFiles();
//        String[] list = file6.list();
//        for (File f:
//                files) {
//            System.out.println("文件对象------>"+f);
//            //D:\MyGitNote\java
//        }
//
//        for (String f:
//             list) {
//            System.out.println("文件字符串------>"+list);
//            //[Ljava.lang.String;@6d6f6e28
//        }
//
//        File file7 = new File("D://io/a/b/c/d/e/f");
//        //只能创建 单个文件
//        file7.mkdir();
//        //可以创建多个 子文件
//        file7.mkdirs();
//
//
//
//
//
//    }


    public static void main(String[] args) {
        File file8 = new File("D://lixiaoyuIO.txt");
        File file9 = new File("D://io//a.txt");
        //把file8 复制到 file9下
        boolean b = file8.renameTo(file9);
        System.out.println(b);
    }


    //遍历文件
    @Test
    public void getFiles(){

        File file = new File("D:\\MyGitNote");
        File file2 = new File("a.txt");


        //获取到文件夹里头的文件
        File[] files = file.listFiles();

        //查询文件夹里面的所有的文件
        listFiles(files);

    }

    /**
     * 遍历 所有子文件
     * @param files
     */
    private void listFiles(File[] files) {
        //判断文件 不是空 并且  文件大小大于0
        if(files != null && files.length > 0){
            //遍历文件
            for (File f: files) {
                //判断是否是文件夹
                if(f.isDirectory()){
                    //输出文件名
                    System.out.println(f.getName()+"是文件夹");
                    System.out.println(f.getName()+"下的文件有:");
                    //如果是文件夹的话 再次 遍历 其下面的文件
                    File[] files1 = f.listFiles();
                    //递归寻找
                    listFiles(files1);
                }
                //判断是否是文件
                if(f.isFile()){
                    System.out.println(f.getName()+"是文件。");
                    System.out.println("文件的路劲是："+f.getAbsolutePath());
                    //判断大小
                    if(f.length() > 100*1024){
                        System.out.println("大于100B的文件：-----------------"+f.getName());
                    }
                    //遍历 .txt 文件。  endsWith(String) 如果是String后缀 就返回true
                    if(f.getName().endsWith(".txt")){
                        System.out.println(f.getName()+"》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》是txt文件");
                    }
                }
            }
        }
    }


    @Test
    public void filterTest(){

        File file = new File("D:\\io");

        mdFileFilterFunction(file);

    }

    private void mdFileFilterFunction(File file) {

        //创建过滤器
        FileFilter filter = new mdFileFilter();

        //获取子文件数组  file.listFiles(filter); 传入过滤器
        File[] files = file.listFiles(filter);
        if(files != null && files.length > 0)
        for (File f:
             files) {
            //判断 是文件夹
            if(f.isDirectory()) {
                mdFileFilterFunction(f);
            }else {
                System.out.println("发现md文件" + f.getName());
            }
        }
    }


}

/**
 * 描述过滤器规则的  实现类
 */
class mdFileFilter implements FileFilter {

    @Override
    public boolean accept(File pathname) {
        //如果 文件名字是 .md结尾的 或者是 文件夹  就展示
        //如果不加文件夹的话 可能第一回合 就把文件夹都过滤掉了
        if(pathname.getName().endsWith(".md") || pathname.isDirectory())
            return true;
        return false;
    }
}
